/**
 * Copyright (C) BFH www.bfh.ch 2011
 * Code written by: Patrick Dobler, Marc Folly
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package ch.bfh.ti.kybernetik.engine.model;

import javax.vecmath.Vector2d;

import ch.bfh.ti.kybernetik.lego.ki.RoboterKI;

/**
 * The Factory to create new {@link Roboter} instances
 * 
 */
public class RoboterFactory {

	private static final double ROBOTER_DEFAULT_X = 0;
	private static final double ROBOTER_DEFAULT_Y = 0;

	private static final double ROBOTER_DEFAULT_MOTER_LEFT_SPEED = 0;
	private static final double ROBOTER_DEFAULT_MOTER_RIGHT_SPEED = 0;
	private static final double MOTOR_DEFAULT_DISTANCE = 5;

	private static final double LIGHTSENSOR_DEFAULT_DISTANCE = 10;
	private static final double LIGHTSENSOR_DEFAULT_VIEWFIELDSIZE = 140;
	private static final double LIGHTSENSOR_DEFAULT_ANGLE = 0;

	private static final double LIGHTSENSOR_MAX_INTENSITY = 300;

	/**
	 * Creates a default {@link Roboter} model with the given {@link RoboterKI}
	 * 
	 * @return a new {@link Roboter} instance
	 */
	public static Roboter createRoboter() {
		Motor leftMotor = new Motor(ROBOTER_DEFAULT_MOTER_LEFT_SPEED, -MOTOR_DEFAULT_DISTANCE);
		Motor rightMotor = new Motor(ROBOTER_DEFAULT_MOTER_RIGHT_SPEED, MOTOR_DEFAULT_DISTANCE);

		LightSensor leftLightSensor = new LightSensor(-LIGHTSENSOR_DEFAULT_DISTANCE, -LIGHTSENSOR_DEFAULT_ANGLE,
				LIGHTSENSOR_DEFAULT_VIEWFIELDSIZE, LIGHTSENSOR_MAX_INTENSITY);
		LightSensor rightLightSensor = new LightSensor(LIGHTSENSOR_DEFAULT_DISTANCE, LIGHTSENSOR_DEFAULT_ANGLE,
				LIGHTSENSOR_DEFAULT_VIEWFIELDSIZE, LIGHTSENSOR_MAX_INTENSITY);

		Vector2d direction = new Vector2d(1, 0);
		Roboter roboter = new Roboter(ROBOTER_DEFAULT_X, ROBOTER_DEFAULT_Y, leftMotor, rightMotor, direction, leftLightSensor,
				rightLightSensor);

		return roboter;
	}

	/**
	 * Creates a random positioned {@link Roboter} instance
	 * 
	 * @param maxX
	 *            maximum x-coordinate that a random {@link Roboter} shall have
	 * @param maxY
	 *            maximum y-coordinate that a random {@link Roboter} shall have
	 * @return
	 */
	public static Roboter createRandomRoboter(int maxX, int maxY) {
		Roboter roboter = createRoboter();
		roboter.setX(generateNumberBetweenRange(10, maxY));
		roboter.setY(generateNumberBetweenRange(10, maxY));

		Vector2d direction = new Vector2d(generateNumberBetweenRange(-100, 100), generateNumberBetweenRange(-100, 100));
		direction.normalize();
		roboter.setDirection(direction);
		return roboter;
	}

	private static int generateNumberBetweenRange(int min, int max) {
		return min + (int) (Math.random() * ((max - min) + 1));
	}

}
